package cn.agiledata.bank.transaction.facade;

import java.math.BigDecimal;

import cn.agiledata.bank.common.util.PageBean;
import cn.agiledata.bank.hibernateBean.Account;
import cn.agiledata.bank.hibernateBean.SubAccount;
import cn.agiledata.bank.transaction.exception.TransactionException;
import cn.agiledata.bank.transaction.logic.BatchPeerAccount;
import cn.agiledata.bank.transaction.logic.PeerAccountAmount;

public interface TransactionFacade {

    /**
     * 获取交易对方列表，列表中的记录包含是否已被设置的相关信息
     * 
     * @param accountId
     *            账户主键id
     * @param batchPeerAccount
     *            已设置的交易对方和金额
     * @param startPage
     *            起始页，从1开始计数
     * @param pageRecord
     *            每页记录数
     * @return 交易对方列表
     */
    public PageBean getPeerAccountList(Long accountId,
            BatchPeerAccount batchPeerAccount, String startPage,
            String pageRecord);

    /**
     * 获取已设置的交易对方账户金额列表
     * 
     * @param batchPeerAccount
     *            批量交易对方对象
     * @param startPage
     *            起始页，从1开始计数
     * @param pageRecord
     *            每页记录数
     * @return 交易对方账户金额列表
     */
    public PageBean getPeerAccountAmountList(BatchPeerAccount batchPeerAccount,
            int startPage, int pageRecord);

    /**
     * 校验金额，并返回校验过的金额
     * 
     * @param amount
     *            金额
     * @return 校验过的金额
     * @throws TransactionException
     *             如果校验出错
     */
    public BigDecimal validateAmount(String amount) throws TransactionException;

    /**
     * 保存批量支付交易对方金额设置到session中，并返回付款方手续费
     * 
     * @param peerAccountId
     *            交易对方账户id
     * @param amount
     *            金额
     * @return 交易对方金额设置
     */
    public PeerAccountAmount savePeerAccountAmount(long peerAccountId,
            String amount);

    /**
     * 删除保存在session中的指定交易对方账户id对应的金额设置
     * 
     * @param peerAccountId
     *            交易对方账户id
     * @return 新的批量交易对方对象
     */
    public BatchPeerAccount removePeerAccountAmount(long peerAccountId);

    /**
     * 获取保存在session中的批量交易对方对象
     * 
     * @return 批量交易对方对象
     */
    public BatchPeerAccount getBatchPeerAccount();

    /**
     * 校验付款子账户余额，如果校验通过，则返回付款子账户对象
     * 
     * @param debitSubAccountId
     *            付款子账户id
     * @param amount
     *            应付金额
     * @return 付款子账户
     * @throws TransactionException
     *             如果校验失败
     */
    public SubAccount validateBalance(long debitSubAccountId, BigDecimal amount)
            throws TransactionException;

    /**
     * 获取指定账户的指定交易类型的收费方式描述
     * 
     * @param account
     *            账户
     * @param actionType
     *            交易类型
     * @return 收费方式描述
     */
    public String getFeeModeDescription(Account account, String actionType);


}